//  概念： 1，一个函数返回一个函数   2 一个函数可以接受以一个参数是函数

// 处理问题    扩展方法

function say() {
    console.log('say');
}

Function.prototype.before = function (cb) {
    return (...args) => {
        cb();
        this(...args);
    }
}

let newSay = say.before(() => {
    console.log('before say');
})

newSay()

//  可以通过高阶函数实现参数的保留
/**
 * 判断类型的几种方法
 * typeof 判断基础类型
 * instanceof  判断实例类型
 * constuctor  当前实例由谁构造
 * Object.prototype.toString.call()
 * 闭包： 函数声明的作用于和执行的作用域是不一样时，导致闭包
*/
function isType(val, typing) {
    return () => Object.prototype.toString.call(val) === `[object ${typing}]`
}
let isString = isType('String')
console.log(isString(''));
console.log(isType(123, 'Number'));